<!DOCTYPE html>
<html lang="cn">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>函数</title>
</head>

<body>

</body>

</html>
<script>
    // //声明了一个叫'fun1'的函数
    // function fun1() {
    //     console.log('函数fun1成功被调用');
    // }
    // fun1()//调用函数

    // //封装了一个名叫'fun2'的函数，作用是可以进行加法运算 a,b是形参
    // function fun2(a, b) {
    //     return a + b
    // }
    // console.log(fun2(10, 20)); //10,20 是实参
    // //实参如果传入的值，如果是基本数据类型 (number、string、bol)，在函数中修改形参的值不影响原数据值，如果是(arr、obj)引用型会修改原数据值

    // let a = 10
    // function fun3(n) {
    //     n++
    //     console.log(n);
    // }
    // fun3(a)

    // let obj = { name: '张三', age: 28 }
    // function fun4(info) {
    //     info.name = '李四'
    // }
    // fun4(obj)
    // console.log(obj);

    // //变量式声明函数
    // let fun6 = function () {
    //     console.log('成功调用');
    // }

    // //参数作用域
    // // function fun7 (a,b) {
    // //     console.log(a,b);
    // //     let str = 'abc'
    // // }
    // // console.log(b,'------');

    // //参数默认值
    // function fun8(str, num) {
    //     num = num == undefined ? 0 : num
    //     str = str || '默认值'
    //     console.log(str, '-------', num);
    // }
    // fun8('ok', 20)//不传实参则用默认值，若传实参则用传的值

    // //对位传参
    // function fun9(name, age, sex, job, hight) {
    //     console.log(`姓名:${name}--年龄:${age}--性别:${sex}--工作:${job}--身高:${hight}`);

    // }
    // fun9('张三', 29, '男', '程序员', 170)

    // function fun10() {
    //     console.log(arguments);
    //     //arguments是一个伪数组，他像数组但不是数组，有数组的下标和属性但不能使用数组的方法
    //     arguments = Array.prototype.slice.call(arguments)
    //     console.log(arguments);
    //     let sum = arguments.reduce(function (per, cur) {
    //         return per += cur
    //     }, 0)
    //     // let sum = 0
    //     // for(let i=0;i<arguments.length;i++){
    //     //     sum += arguments[i]
    //     // }
    //     console.log(sum);
    // }
    // fun10(1, 2, 5, 8, 6, 9)

    // //地址传递
    // var stu = { name: "张三", major: "软件技术" }
    // function test_2(obj) {
    //     obj.major = "软件工程";
    // }
    // test_2(stu);
    // function test_1(obj) {
    //     obj.major = "计算机应用"
    // }
    // test_1(stu)
    // console.log(stu.major);

    // //函数返回值
    // let num = 5
    // function fun11() {
    //     console.log('return之前正常执行');
    //     return 5 * 2
    //     console.log('return之后不执行');
    // }
    // console.log(fun11());
    // // console.log(num);

    // //闭包函数
    // function fun12() {
    //     let i = 10
    //     console.log(i);
    //     function fun13() {
    //         //对父级作用域变量的操作，计算后的值会存储在内存之中，下次计算好会直接从内存中取值
    //         i = i + 1
    //         console.log(i);
    //     }
    //     fun13()
    // }
    // fun12()
    // let fun12back = fun12()
    // fun12Back()
    // fun12Back()
    // fun12Back()
    // let num1 = 10,num2=20;
    // function fun13() {
    //     console.log(num1+num2);
    // }
    // num2 = 0
    // fun3()

    function fun14(a, b, type) {
        let num1 = a
        let num2 = b
        switch (type) {
            case '+':
                return function () {
                    console.log(`num1 + num2 = ${num1} + ${num2}`);
                }
        }
    }
    let fun14Back = fun14(10, 20, '+')
    fun14Back()

    //递归函数
    function fun15(n) {
        console.log(n);
        if (n <= 1) {
            return 1
        } else {
            // return n = fun15(n-1)
            return n * arguments.callee(n - 1)
        }
    }
    fun15(10)
    console.log(fun15(10));

    //1
    let pi = Math.PI.toFixed(2)
    function s(r) {
        console.log(pi * Math.pow(r, 2).toFixed(2));
    }
    s(10)

    //2
    function fun16(age) {
        if (age > 18) {

            console.log("可以浏览改网站");
            return; age
        } else {

            console.log("还是去看葫芦娃娃");
            return
        }
    }
    fun16(20)
    fun16(16)

    //3
    function fun17(a, b) {
        dwf = Math.random() * (a - b) + b
        console.log(dwf.toFixed(0));//随机数
    }
    fun17(50, 10)

    //4
    function fun18() {
        console.log(arguments);
        switch (arguments.length) {
            case 0:
            //     console.log(Math.random(Math.random() * (10 - 1) + 1));
            //     break
            // case 1:
            //     console.log(Math.random(Math.random() * arguments[0]));
            //     break
            // case 2:
            //     // let num = Math.round(Math.random()*(arguments[1] - arguments[0] + arguments[0]))
            //     arguments = Array.prototype.slice.call(arguments)
            //     console.log(num);
                // arguments.sort(function(a,b){
                //     return a - b
                // })
                    //ES6箭头函数写法 Array.from()将伪数组转换为数组
                arguments = Array.from(arguments).sort((a,b)=>a-b)

                let num = Math.random(Math.random()*(arguments)[1] - arguments[0] + arguments[0])
                console.log(num);
        }
    }
    fun18()
    fun18(5)
    fun18(10, 20)

    //5  
    function fun19(len, start, end) {
        arguments = Array.prototype.slice.call(arguments)
        switch (arguments.length) {
            case 0:
                for (let i = 0; i < 5; i++) {
                    arguments.push(parseInt(Math.random() * 100))
                }
                console.log(arguments);
                break
            case 1:
                let arr1 = []
                for (let j = 0; j < arguments[0]; j++) {
                    arr1.push(parseInt(Math.random() * 100))
                }
                console.log(arr1);
                break
            case 2:
                let arr2 = []
                let num = ""
                for (let k = 0; k < arguments[0]; k++) {
                    num = Math.round(Math.random() * (100 - arguments[1]) + arguments[1])
                    arr2.push(num)
                }
                console.log(arr2);
                break
            case 3:
                let arr3 = []
                let num1 = ""
                for (let f = 0; f < arguments[0]; f++) {
                    if (arguments[1] >= arguments[2]) {
                        num1 = Math.round(Math.random() * (arguments[1] - arguments[2]) + arguments[2])
                        arr3.push(num1)
                    } else {
                        num1 = Math.round(Math.random() * (arguments[2] - arguments[1]) + arguments[1])
                        arr3.push(num1)
                    }
                }
                console.log(arr3);
                break
        }
    }
    fun19(10, 80, 90)

    //6
    function fun20() {
        arguments = Array.prototype.slice.call(arguments)
        arguments.sort(function (a, b) {
            return a - b
        })
        let arr4 = []
        arr4.push(arguments[arguments.length - 1])
        arr4.push(arguments[0])
        console.log(arr4);
    }
    fun20(9, 45, 78, 63, 44)

    //7
    console.log('不会');

    //8
    function fun21(stu) {
        console.log(`文字模板为：${stu.className}${stu.name},
            语文分数:${stu.chiScore},
            数学分数:${stu.mathScore},
            英语分数:${stu.engScore},
            总分：${stu.chiScore + stu.mathScore + stu.engScore}
            平均分：${(stu.chiScore + stu.mathScore + stu.engScore) / 3}
                `)
    }
    fun21({ name: "坤坤", className: "偶像练习生", mathScore: 70, engScore: 10, chiScore: 40 })
</script>